package cn.john.user.service.impl;

import cn.john.basic.exception.BusinessException;
import cn.john.basic.util.StrUtils;
import cn.john.user.constants.UserConstants;
import cn.john.user.domain.User;
import cn.john.user.mapper.UserMapper;
import cn.john.user.service.IVerifyCodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {
    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void sendSmsCode(Map<String,String> param) {
        String phone = param.get("phone");
        String type = param.get("type");
        // 校验
        // 判断手机号不为空
        if(!StringUtils.hasLength(phone)){
            throw new BusinessException("请输入手机号！");
        }
        String businessKey = "";
        if ("register".equals(type)) {
            // 判断手机号不能被注册
            User user = userMapper.loadByPhone(phone);
            if(user != null) {
                throw new BusinessException("手机号已经注册，请直接登录！");
            }
            businessKey = UserConstants.REGISTER_PHONE_PREFIX + phone;
        } else if("binder".equals(type)){
            businessKey = UserConstants.BINDER_PHONE_PREFIX + phone;
        }
        sendSmsCode(businessKey);
    }

    public void sendSmsCode(String businessKey){
        // 判断验证码是否过期，3分钟(就是看能否从redis中拿到)
        String key = businessKey;
        Object codeTmp = redisTemplate.opsForValue().get(key);
        String code = "";
        // 从redis中拿到了，即没有过期
        // value:       9999:2513214312434123
        if(codeTmp != null) {
            String[] arry = codeTmp.toString().split(":");
            // 判断是否过了重发时间，如果没有过重发时间，直接抛错
            if(System.currentTimeMillis() - Long.valueOf(arry[1]) < 1 * 60 * 1000){
                throw new BusinessException("请勿重复发送验证码！");
            }
            // 如果过了重发时间，使用原来的验证码
            code = arry[0];
        }else {     //如果从redis中没有拿到，即说明验证码已经过期，或者此手机号没有发送过验证码
            // 生成新的验证码
            code = StrUtils.getComplexRandomString(4);
        }
        // 将验证码存到redis，并刷新过期时间(即重新设置刷新时间为3分钟)
        redisTemplate.opsForValue().set(key, code + ":" + System.currentTimeMillis(), 3, TimeUnit.MINUTES);
        // 发送短信提示用户尽快使用
        //SmsUtil.sendSms(phone, "宠物乐园： 您的注册验证码为：" + code + "，请尽快使用(验证码3分钟过期)");
        System.out.println("宠物乐园： 您的注册验证码为：" + code + "，请尽快使用(验证码3分钟过期)");

    }
}
